﻿using System;
using Server.Items;
using Server.Mobiles;
using Server.Network;
using System.Collections;
using System.Collections.Generic;
using Server.Commands;

namespace Server.Items
{
    public static class PotionSystem
    {
        public static void Initialize()
        {
            TabellaPozioniAttive = new Dictionary<Mobile, List<PozioneBase>>();
            CommandSystem.Register("beviPozione", AccessLevel.Player, new CommandEventHandler(PotionSystem.GestoreComandi));
        }

        public static void GestoreComandi(CommandEventArgs e)
        {
            if (e.Length == 1)
            {
                int comando = e.GetInt32(0);
                // Parsing fallito, comando malformato.
                if (comando == 0)
                    return;

                switch (comando)
                {
                    case 1:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneAntidoto));
                        break;
                    case 2:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneAntidotoMaggiore));
                        break;
                    case 3:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneCura));
                        break;
                    case 4:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneCuraMaggiore));
                        break;
                    case 5:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneDifesa));
                        break;
                    case 6:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneDifesaMaggiore));
                        break;
                    case 7:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneRistoro));
                        break;
                    case 8:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneRistoroMaggiore));
                        break;
                    case 9:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneVigore));
                        break;
                    case 10:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneNuovoVigore));
                        break;
                    case 11:
                        //Erbe
                        break;
                    case 12:
                        //Bende
                        break;
                    case 13:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneForza));
                        break;
                    case 14:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneForzaMaggiore));
                        break;
                    case 15:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneIntuito));
                        break;
                    case 16:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneIntuitoMaggiore));
                        break;
                    case 17:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneAgilita));
                        break;
                    case 18:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneAgilitaMaggiore));
                        break;
                    case 19:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneMeditazione));
                        break;
                    case 20:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneMeditazioneMaggiore));
                        break;
                    case 21:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneCostituzione));
                        break;
                    case 22:
                        PotionSystem.BeviPozione(e.Mobile, typeof(PozioneCostituzioneMaggiore));
                        break;
                    default:
                        break;
                }
            }
        }

        // Memorizza per ogni mobile una lista di pozioni attive su quel mobile.
        private static Dictionary<Mobile, List<PozioneBase>> TabellaPozioniAttive;

        public static PozioneBase LookUpPozione(Mobile m, PozioneBase Pozione)
        {
            List<PozioneBase> PozioniAttive;

            if (TabellaPozioniAttive.TryGetValue(m, out PozioniAttive))
            {
                foreach (PozioneBase p in PozioniAttive)
                {
                    if (p.GetType() == Pozione.GetType())
                    {
                        return p;
                    }
                }
            }

            return null;
        }

        private static void RegistraPozione(Mobile m, PozioneBase Pozione)
        {
            if (LookUpPozione(m, Pozione) != null)
                return;

            List<PozioneBase> PozioniAttive;

            if (! TabellaPozioniAttive.TryGetValue(m, out PozioniAttive))
            {
                PozioniAttive = new List<PozioneBase>();
                TabellaPozioniAttive.Add(m, PozioniAttive);
            }

            PozioniAttive.Add(Pozione);
        }

        private static void DeregistraPozione(Mobile m, PozioneBase Pozione)
        {
            PozioneBase PozioneDaRimuovere = LookUpPozione(m, Pozione);
            if (PozioneDaRimuovere == null)
                return;

            List<PozioneBase> PozioniAttive;
            if (! TabellaPozioniAttive.TryGetValue(m, out PozioniAttive))
            {
                ((PlayerMobile)m).SendMessage("DEBUG: errore #1456 contattare lo staff");
                return;
            }

            PozioniAttive.Remove(PozioneDaRimuovere);
        }

        public static bool BeviPozione(Mobile m, Type TipoPozione)
        {
            PlayerMobile player = null;

            if (m is PlayerMobile)
                player = (PlayerMobile)m;

            if (DateTime.Now < m.DelayGeneralePozione)
            {
                if (player != null)
                    player.SendMessage("Non puoi ancora bere una pozione");

                return false;
            }

            Container pack = m.Backpack;

            if (pack == null)
                return false;

            Item item = pack.FindItemByType(TipoPozione);
            
            if (item == null)
            {
                if (player != null)
                    player.SendMessage("Non hai pozioni di questo tipo");

                return false;
            }

            // Consuma la pozione
            item.Amount--;
            if (item.Amount == 0)
                pack.RemoveItem(item);

            PozioneBase Pozione = (PozioneBase)item;

            // Settiamo il delay generale della pozione
            m.DelayGeneralePozione = DateTime.Now + TimeSpan.FromSeconds(Pozione.Delay);

            player.PublicOverheadMessage(MessageType.Regular, Pozione.Hue, false, "*" + m.Name + " beve una pozione*");

            PozioneBase PozionePresente = PotionSystem.LookUpPozione(m, Pozione);

            if (Pozione.DurataEffetto > 0)
            {
                PotionSystem.RegistraPozione(m, Pozione);

                if (PozionePresente == null)
                {
                    Pozione.EffettoInternal(m);
                }
                else
                {
                    if (player != null)
                        player.SendMessage(Pozione.Hue, "Rinnovi la pozione");

                    PozionePresente.Rinnova();
                }
            }
            else
            {
                Pozione.EffettoInternal(m);
            }
            
            return true;
        }
    } // chiude class PotionSystem 

    public class PotionTimer : Timer
    {
        Mobile m_Bevitore;
        PozioneBase m_Pozione;

        public PotionTimer(Mobile from, PozioneBase Pozione, TimeSpan castDelay)
            : base(castDelay)
        {
            Priority = TimerPriority.TwentyFiveMS;
            m_Bevitore = from;
            m_Pozione = Pozione;
        }

        // Quando scade il timer.
        protected override void OnTick()
        {
            if (m_Bevitore is PlayerMobile)
            {
                m_Bevitore.PublicOverheadMessage(MessageType.Regular, m_Pozione.Hue, false, "*L'effetto della pozione svanisce*");
            }

            m_Pozione.EffettoScaduto(m_Bevitore);
        }
    }

    public abstract class PozioneBase : Item
    {
        PotionTimer m_Timer;

        // Questi metodi possono essere re-implementati.
        public virtual String DefNome { get { return "Base"; } }
        public virtual int DefDelay {get { return 10; } }
        public virtual int DefDurataEffetto{ get { return 0; } }
        public virtual int DefHue{ get { return 0x240; } }
        public virtual void Effetto(Mobile m) { }
        public virtual void EffettoScaduto(Mobile m) { }
       
        [Constructable]
        public PozioneBase(int amount)
            : base(0x0F0E)
        {
            Hue = DefHue;
            Stackable = true;
            Amount = amount;
        }

        public PozioneBase(Serial serial)
            : base(serial)
        {
        }

        public override double DefaultWeight
        {
            get { return 0.1; }
        }

        public void EffettoInternal(Mobile m)
        {
            // Se la pozione ha un effetto che dura per un certo lasso di tempo, creiamo una istanza del timer
            // E lo facciamo partire.
            if (DurataEffetto > 0)
            {
                Timer = new PotionTimer(m, this, TimeSpan.FromSeconds(DurataEffetto));
                Timer.Start();
            }

            Effetto(m);
        }

        public void Rinnova()
        {
            // Estendiamo il timer
            Timer.Stop();
            Timer.Delay = TimeSpan.FromSeconds(DurataEffetto);
            Timer.Start();
        }

        public override void OnDoubleClick(Mobile from)
        {
            PotionSystem.BeviPozione(from, GetType());
        }

        public new virtual void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
        }

        public new virtual void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
        }

        public override void AddNameProperty(ObjectPropertyList list)
        {
            String pozione_i = (Amount == 1) ? "pozione" : "pozioni";

            list.Add(Amount.ToString() + " pozione di " + Nome);
        }

        public override void GetProperties(ObjectPropertyList list)
        {
            AddNameProperty(list);
        }

        public virtual String Nome { get { return DefNome; } }
        public virtual int Delay {get { return DefDelay; } }
        public virtual int DurataEffetto { get { return DefDurataEffetto; } }
        public virtual PotionTimer Timer { 
            get { return m_Timer; }
            set { m_Timer = value; }
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneCuraLeggera : PozioneBase
    {
        [Constructable]
        public PozioneCuraLeggera()
            : base(1)
        {
        }

        public PozioneCuraLeggera(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Cura Leggera"; } }
        public override int DefDelay { get { return 13; } }
        public override int DefHue { get { return 0x0038; } }

        public override void Effetto(Mobile m)
        {
            // Cura 18 PF
            m.Hits += 18;
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneCura : PozioneBase
    {
        [Constructable]
        public PozioneCura()
            : base(1)
        {
        }

        public PozioneCura(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Cura"; } }
        public override int DefDelay { get { return 13; } }
        public override int DefHue { get { return 0x0038; } }

        public override void Effetto(Mobile m)
        {
            // Cura 28 PF
            m.Hits += 28;
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneCuraMaggiore : PozioneBase
    {
        [Constructable]
        public PozioneCuraMaggiore()
            : base(1)
        {
        }

        public PozioneCuraMaggiore(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Cura Maggiore"; } }
        public override int DefDelay { get { return 13; } }
        public override int DefHue { get { return 0x0038; } }

        public override void Effetto(Mobile m)
        {
            // Cura 38 PF
            m.Hits += 38;
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneVigore : PozioneBase
    {
        [Constructable]
        public PozioneVigore()
            : base(1)
        {
        }

        public PozioneVigore(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Vigore"; } }
        public override int DefDelay { get { return 13; } }
        public override int DefHue { get { return 0x098D; } }

        public override void Effetto(Mobile m)
        {
            // 40 stamina
            m.Stam += 40;
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneNuovoVigore : PozioneBase
    {
        [Constructable]
        public PozioneNuovoVigore()
            : base(1)
        {
        }

        public PozioneNuovoVigore(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Nuovo Vigore"; } }
        public override int DefDelay { get { return 13; } }
        public override int DefHue { get { return 0x098D; } }

        public override void Effetto(Mobile m)
        {
            // 58 stamina
            m.Stam += 58;
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneRistoroMinore : PozioneBase
    {
        [Constructable]
        public PozioneRistoroMinore()
            : base(1)
        {
        }

        public PozioneRistoroMinore(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Ristoro Minore"; } }
        public override int DefDelay { get { return 15; } }
        public override int DefHue { get { return 0x07AD; } }

        public override void Effetto(Mobile m)
        {
            // 18 PF e stamina
            m.Hits += 18;
            m.Stam += 18;
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneRistoro : PozioneBase
    {
        [Constructable]
        public PozioneRistoro()
            : base(1)
        {
        }

        public PozioneRistoro(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Ristoro"; } }
        public override int DefDelay { get { return 15; } }
        public override int DefHue { get { return 0x07AD; } }

        public override void Effetto(Mobile m)
        {
            // 28 PF e stamina
            m.Hits += 28;
            m.Stam += 28;
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneRistoroMaggiore : PozioneBase
    {
        [Constructable]
        public PozioneRistoroMaggiore()
            : base(1)
        {
        }

        public PozioneRistoroMaggiore(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Ristoro Maggiore"; } }
        public override int DefDelay { get { return 15; } }
        public override int DefHue { get { return 0x07AD; } }

        public override void Effetto(Mobile m)
        {
            // 34 PF e stamina
            m.Hits += 34;
            m.Stam += 34;
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneAntidotoMinore : PozioneBase
    {
        [Constructable]
        public PozioneAntidotoMinore()
            : base(1)
        {
        }

        public PozioneAntidotoMinore(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Antidoto Minore"; } }
        public override int DefDelay { get { return 5; } }
        public override int DefHue { get { return 0x002D; } }

        public override void Effetto(Mobile m)
        {
            // TODO: Cura veleno di 7
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneAntidoto : PozioneBase
    {
        [Constructable]
        public PozioneAntidoto()
            : base(1)
        {
        }

        public PozioneAntidoto(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Antidoto"; } }
        public override int DefDelay { get { return 5; } }
        public override int DefHue { get { return 0x002D; } }

        public override void Effetto(Mobile m)
        {
            // TODO: Cura veleno di 12
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneAntidotoMaggiore : PozioneBase
    {
        [Constructable]
        public PozioneAntidotoMaggiore()
            : base(1)
        {
        }

        public PozioneAntidotoMaggiore(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Antidoto Maggiore"; } }
        public override int DefDelay { get { return 5; } }
        public override int DefHue { get { return 0x002D; } }

        public override void Effetto(Mobile m)
        {
            // TODO: Cura veleno di 17
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneForzaMinore : PozioneBase
    {
        [Constructable]
        public PozioneForzaMinore()
            : base(1)
        {
        }

        public PozioneForzaMinore(Serial serial)
            : base(serial)
        {
        }

        public static StatMod modForza;

        public static void Initialize()
        {
            // +2 forza
            modForza = new StatMod(StatType.Forza, "Pozione_Forza_Minore", 2, TimeSpan.Zero);
        }

        public override String DefNome { get { return "Forza Minore"; } }
        public override int DefDelay { get { return 18; } }
        public override int DefHue { get { return 0x00E3; } }
        // 60 + (2*8)
        public override int DefDurataEffetto { get { return 76; } }

        public override void Effetto(Mobile m)
        {
            m.AddStatMod(modForza);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveStatMod("Pozione_Forza_Minore");
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneForza : PozioneBase
    {
        [Constructable]
        public PozioneForza()
            : base(1)
        {
        }

        public PozioneForza(Serial serial)
            : base(serial)
        {
        }

        public static StatMod modForza;

        public static void Initialize()
        {
            // +4 forza
            modForza = new StatMod(StatType.Forza, "Pozione_Forza", 4, TimeSpan.Zero);
        }

        public override String DefNome { get { return "Forza"; } }
        public override int DefDelay { get { return 18; } }
        public override int DefHue { get { return 0x00E3; } }
        // 60 + (4*8)
        public override int DefDurataEffetto { get { return 92; } }

        public override void Effetto(Mobile m)
        {
            m.AddStatMod(modForza);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveStatMod("Pozione_Forza");
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneForzaMaggiore : PozioneBase
    {
        [Constructable]
        public PozioneForzaMaggiore()
            : base(1)
        {
        }

        public PozioneForzaMaggiore(Serial serial)
            : base(serial)
        {
        }

        public static StatMod modForza;

        public static void Initialize()
        {
            // +6 forza
            modForza = new StatMod(StatType.Forza, "Pozione_Forza_Maggiore", 6, TimeSpan.Zero);
        }

        public override String DefNome { get { return "Forza Maggiore"; } }
        public override int DefDelay { get { return 18; } }
        public override int DefHue { get { return 0x00E3; } }
        // 60 + (6*8)
        public override int DefDurataEffetto { get { return 108; } }

        public override void Effetto(Mobile m)
        {
            m.AddStatMod(modForza);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveStatMod("Pozione_Forza_Maggiore");
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneAgilitaMinore : PozioneBase
    {
        [Constructable]
        public PozioneAgilitaMinore()
            : base(1)
        {
        }

        public PozioneAgilitaMinore(Serial serial)
            : base(serial)
        {
        }

        public static StatMod modAgilita;

        public static void Initialize()
        {
            // +10 dex
            modAgilita = new StatMod(StatType.Dex, "Pozione_Agilita_Minore", 10, TimeSpan.Zero);
        }

        public override String DefNome { get { return "Agilita' Minore"; } }
        public override int DefDelay { get { return 18; } }
        public override int DefHue { get { return 0x0847; } }
        // 60 + (10*8)
        public override int DefDurataEffetto { get { return 140; } }

        public override void Effetto(Mobile m)
        {
            m.AddStatMod(modAgilita);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveStatMod("Pozione_Agilita_Minore");
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneAgilita : PozioneBase
    {
        [Constructable]
        public PozioneAgilita()
            : base(1)
        {
        }

        public PozioneAgilita(Serial serial)
            : base(serial)
        {
        }

        public static StatMod modAgilita;

        public static void Initialize()
        {
            // +15 dex
            modAgilita = new StatMod(StatType.Dex, "Pozione_Agilita", 15, TimeSpan.Zero);
        }

        public override String DefNome { get { return "Agilita'"; } }
        public override int DefDelay { get { return 18; } }
        public override int DefHue { get { return 0x0847; } }
        // 60 + (15*8)
        public override int DefDurataEffetto { get { return 180; } }

        public override void Effetto(Mobile m)
        {
            m.AddStatMod(modAgilita);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveStatMod("Pozione_Agilita");
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneAgilitaMaggiore : PozioneBase
    {
        [Constructable]
        public PozioneAgilitaMaggiore()
            : base(1)
        {
        }

        public PozioneAgilitaMaggiore(Serial serial)
            : base(serial)
        {
        }

        public static StatMod modAgilita;

        public static void Initialize()
        {
            // +20 dex
            modAgilita = new StatMod(StatType.Dex, "Pozione_Agilita_Maggiore", 20, TimeSpan.Zero);
        }

        public override String DefNome { get { return "Agilita' Maggiore"; } }
        public override int DefDelay { get { return 18; } }
        public override int DefHue { get { return 0x0847; } }
        // 60 + (20*8)
        public override int DefDurataEffetto { get { return 220; } }

        public override void Effetto(Mobile m)
        {
            m.AddStatMod(modAgilita);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveStatMod("Pozione_Agilita_Maggiore");
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneIntuitoMinore : PozioneBase
    {
        [Constructable]
        public PozioneIntuitoMinore()
            : base(1)
        {
        }

        public PozioneIntuitoMinore(Serial serial)
            : base(serial)
        {
        }

        public static StatMod modIntuito;

        public static void Initialize()
        {
            // +15 Int
            modIntuito = new StatMod(StatType.Int, "Pozione_Intuito_Minore", 15, TimeSpan.Zero);
        }

        public override String DefNome { get { return "Intuito Minore"; } }
        public override int DefDelay { get { return 18; } }
        public override int DefHue { get { return 0x0847; } }
        // 60 + (15*8)
        public override int DefDurataEffetto { get { return 180; } }

        public override void Effetto(Mobile m)
        {
            m.AddStatMod(modIntuito);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveStatMod("Pozione_Intuito_Minore");
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneIntuito : PozioneBase
    {
        [Constructable]
        public PozioneIntuito()
            : base(1)
        {
        }

        public PozioneIntuito(Serial serial)
            : base(serial)
        {
        }

        public static StatMod modIntuito;

        public static void Initialize()
        {
            // +25 Int
            modIntuito = new StatMod(StatType.Int, "Pozione_Intuito", 25, TimeSpan.Zero);
        }

        public override String DefNome { get { return "Intuito"; } }
        public override int DefDelay { get { return 18; } }
        public override int DefHue { get { return 0x0847; } }
        // 60 + (25*8)
        public override int DefDurataEffetto { get { return 260; } }

        public override void Effetto(Mobile m)
        {
            m.AddStatMod(modIntuito);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveStatMod("Pozione_Intuito");
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneIntuitoMaggiore : PozioneBase
    {
        [Constructable]
        public PozioneIntuitoMaggiore()
            : base(1)
        {
        }

        public PozioneIntuitoMaggiore(Serial serial)
            : base(serial)
        {
        }

        public static StatMod modIntuito;

        public static void Initialize()
        {
            // +30 Int
            modIntuito = new StatMod(StatType.Int, "Pozione_Intuito_Maggiore", 30, TimeSpan.Zero);
        }

        public override String DefNome { get { return "Intuito Maggiore"; } }
        public override int DefDelay { get { return 18; } }
        public override int DefHue { get { return 0x0847; } }
        // 60 + (30*8)
        public override int DefDurataEffetto { get { return 300; } }

        public override void Effetto(Mobile m)
        {
            m.AddStatMod(modIntuito);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveStatMod("Pozione_Intuito");
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneCostituzioneMinore : PozioneBase
    {
        [Constructable]
        public PozioneCostituzioneMinore()
            : base(1)
        {
        }

        public PozioneCostituzioneMinore(Serial serial)
            : base(serial)
        {
        }

        public static StatMod modCostituzione;

        public static void Initialize()
        {
            // +13 Str
            modCostituzione = new StatMod(StatType.Str, "Pozione_Costituzione_Minore", 13, TimeSpan.Zero);
        }

        public override String DefNome { get { return "Costituzione Minore"; } }
        public override int DefDelay { get { return 18; } }
        public override int DefHue { get { return 0x00E7; } }
        // 60 + (13*6)
        public override int DefDurataEffetto { get { return 60 + 13*6; } }

        public override void Effetto(Mobile m)
        {
            m.AddStatMod(modCostituzione);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveStatMod("Pozione_Costituzione_Minore");
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneCostituzione : PozioneBase
    {
        [Constructable]
        public PozioneCostituzione()
            : base(1)
        {
        }

        public PozioneCostituzione(Serial serial)
            : base(serial)
        {
        }

        public static StatMod modCostituzione;

        public static void Initialize()
        {
            // +18 Str
            modCostituzione = new StatMod(StatType.Str, "Pozione_Costituzione", 18, TimeSpan.Zero);
        }

        public override String DefNome { get { return "Costituzione"; } }
        public override int DefDelay { get { return 18; } }
        public override int DefHue { get { return 0x00E7; } }
        // 60 + (18*6)
        public override int DefDurataEffetto { get { return 60 + 18 * 6; } }

        public override void Effetto(Mobile m)
        {
            m.AddStatMod(modCostituzione);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveStatMod("Pozione_Costituzione");
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneCostituzioneMaggiore : PozioneBase
    {
        [Constructable]
        public PozioneCostituzioneMaggiore()
            : base(1)
        {
        }

        public PozioneCostituzioneMaggiore(Serial serial)
            : base(serial)
        {
        }

        public static StatMod modCostituzione;

        public static void Initialize()
        {
            // +23 Str
            modCostituzione = new StatMod(StatType.Str, "Pozione_Costituzione_Maggiore", 23, TimeSpan.Zero);
        }

        public override String DefNome { get { return "Costituzione Maggiore"; } }
        public override int DefDelay { get { return 18; } }
        public override int DefHue { get { return 0x00E7; } }
        // 60 + (23*6)
        public override int DefDurataEffetto { get { return 60 + 23 * 6; } }

        public override void Effetto(Mobile m)
        {
            m.AddStatMod(modCostituzione);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveStatMod("Pozione_Costituzione_Maggiore");
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneMeditazione : PozioneBase
    {
        [Constructable]
        public PozioneMeditazione()
            : base(1)
        {
            // +25 meditare
            modMeditazione = new DefaultSkillMod(SkillName.Meditare, true, 25.0);
        }

        public PozioneMeditazione(Serial serial)
            : base(serial)
        {
        }

        public DefaultSkillMod modMeditazione;

        public override String DefNome { get { return "Meditazione"; } }
        public override int DefDelay { get { return 25; } }
        public override int DefHue { get { return 0x07C7; } }
        // 180
        public override int DefDurataEffetto { get { return 180; } }

        public override void Effetto(Mobile m)
        {
            m.AddSkillMod(modMeditazione);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveSkillMod(modMeditazione);
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneMeditazioneMaggiore : PozioneBase
    {
        [Constructable]
        public PozioneMeditazioneMaggiore()
            : base(1)
        {
            // +35 meditare
            modMeditazione = new DefaultSkillMod(SkillName.Meditare, true, 35.0);
        }

        public PozioneMeditazioneMaggiore(Serial serial)
            : base(serial)
        {
        }

        public DefaultSkillMod modMeditazione;

        public override String DefNome { get { return "Meditazione Maggiore"; } }
        public override int DefDelay { get { return 25; } }
        public override int DefHue { get { return 0x07C7; } }
        // 60 + 7*10
        public override int DefDurataEffetto { get { return 60 + 7*10; } }

        public override void Effetto(Mobile m)
        {
            m.AddSkillMod(modMeditazione);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveSkillMod(modMeditazione);
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneDifesa : PozioneBase
    {
        [Constructable]
        public PozioneDifesa()
            : base(1)
        {
        }

        public PozioneDifesa(Serial serial)
            : base(serial)
        {
        }

        public static StatMod modDifesa;

        public static void Initialize()
        {
            // +7 Difesa
            modDifesa = new StatMod(StatType.Difesa, "Pozione_Difesa", 7, TimeSpan.Zero);
        }

        public override String DefNome { get { return "Difesa"; } }
        public override int DefDelay { get { return 25; } }
        public override int DefHue { get { return 0x098A; } }
        // 60 + (7*10)
        public override int DefDurataEffetto { get { return 60 + 7 * 10; } }

        public override void Effetto(Mobile m)
        {
            m.AddStatMod(modDifesa);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveStatMod("Pozione_Difesa");
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneDifesaMaggiore : PozioneBase
    {
        [Constructable]
        public PozioneDifesaMaggiore()
            : base(1)
        {
        }

        public PozioneDifesaMaggiore(Serial serial)
            : base(serial)
        {
        }

        public static StatMod modDifesa;

        public static void Initialize()
        {
            // +12 Difesa
            modDifesa = new StatMod(StatType.Difesa, "Pozione_Difesa_Maggiore", 12, TimeSpan.Zero);
        }

        public override String DefNome { get { return "Difesa Maggiore"; } }
        public override int DefDelay { get { return 25; } }
        public override int DefHue { get { return 0x098A; } }
        // 60 + (12*10)
        public override int DefDurataEffetto { get { return 60 + 12 * 10; } }

        public override void Effetto(Mobile m)
        {
            m.AddStatMod(modDifesa);
        }

        public override void EffettoScaduto(Mobile m)
        {
            m.RemoveStatMod("Pozione_Difesa_Maggiore");
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneVelenoMinore : PozioneBase
    {
        [Constructable]
        public PozioneVelenoMinore()
            : base(1)
        {
        }

        public PozioneVelenoMinore(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Veleno Minore"; } }
        public override int DefHue { get { return 0x0175; } }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneVeleno : PozioneBase
    {
        [Constructable]
        public PozioneVeleno()
            : base(1)
        {
        }

        public PozioneVeleno(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Veleno"; } }
        public override int DefHue { get { return 0x0175; } }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneVelenoMaggiore : PozioneBase
    {
        [Constructable]
        public PozioneVelenoMaggiore()
            : base(1)
        {
        }

        public PozioneVelenoMaggiore(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Veleno Maggiore"; } }
        public override int DefHue { get { return 0x0175; } }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }

    [FlipableAttribute(0x0F0E, 0x0F0E)]
    public class PozioneVelenoMortale : PozioneBase
    {
        [Constructable]
        public PozioneVelenoMortale()
            : base(1)
        {
        }

        public PozioneVelenoMortale(Serial serial)
            : base(serial)
        {
        }

        public override String DefNome { get { return "Veleno Mortale"; } }
        public override int DefHue { get { return 0x0175; } }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }
    }
}